//
//  NetwrokHandler.m
//  UI18_网络请求
//
//  Created by 恩叔 on 15/12/31.
//  Copyright © 2015年 www.lanou3g.com. All rights reserved.
//

#import "NetwrokHandler.h"

@implementation NetwrokHandler

+ (void)GETWithURL:(NSString *)Str completion:(NETBLOCK)netBlock
{
    //中文转码
    NSString *urlStr = [Str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:Str]];
    //str -> url
    NSURL *url = [NSURL URLWithString:urlStr];
    //url -> request
    //参数1 :url
    //参数2 :缓存
    //参数3 :超时
    NSURLRequest *req = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
    //
    NSURLSession *session = [NSURLSession sharedSession];
    //task
    NSURLSessionDataTask *task = [session dataTaskWithRequest:req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            //JSON解析中data不能nil;
            //如果error存在
            if (error) {
                //存在错误
                NSLog(@"错误信息 : %@",error);
            }else{
                NSError *jError = nil;
//                id result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jError];
                id result = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
                if (jError) {
                    NSLog(@"解析错误: %@", jError);
                }else{
                    //向外界传递JSON数据
                    netBlock(result);
                }
            }
        });
    }];
    [task resume];
}
//POST
+ (void)POSTWithURL:(NSString *)Str body:(NSData *)body completion:(NETBLOCK)netBlock
{
    //中文转码
    NSString *urlStr = [Str stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet characterSetWithCharactersInString:Str]];
    //str -> url
    NSURL *url = [NSURL URLWithString:urlStr];
    //url -> request
    //参数1 :url
    //参数2 :缓存
    //参数3 :超时
    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60];
    //POST
    req.HTTPMethod = @"POST";
    //body
    req.HTTPBody = body;
    //
    NSURLSession *session = [NSURLSession sharedSession];
    //task
    NSURLSessionDataTask *task = [session dataTaskWithRequest:req completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            //JSON解析中data不能nil;
            //如果error存在
            if (error) {
                //存在错误
                NSLog(@"错误信息 : %@",error);
            }else{
                NSError *jError = nil;
                id result = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&jError];
                if (jError) {
                    NSLog(@"解析错误: %@", jError);
                }else{
                    //向外界传递JSON数据
                    netBlock(result);
                }
            }
        });
    }];
    [task resume];

}



/////\\\\\
////  \\\\
///    \\\
//封装   \\
\\\\\\\\\\\
//把重复的代码只写一次 以后反复使用

//封装的原因
//1.简化代码(偷懒)
//2.提高代码的扩展性/可重用性


//封装的标志
//想要复制粘贴/重复出现的代码

//封装的方式
//1.方法封装(自适应cell高度)
//把重复代码写在一个方法中 当前类/相关联类中使用

//2.类封装(网络请求/model类)
//把重复代码写在类中 多个类/多个工程 中都可以使用

//3.类目封装(字符串倒序/获取拼音)
//给已经存在的类(系统类)写扩展

//封装的要求
//1.内存管理
//2.返回值/参数 哪些是必须/可选的
//3.安全性 自身保证不会出问题
//4.扩展性 封装是一个可以长期提高优化的方式










@end
